package cn.sccdlg.fzmybatis.mybatis2sx.sqlsession.proxy;

import cn.sccdlg.fzmybatis.mybatis2sx.cfg.Mapper;
import cn.sccdlg.fzmybatis.mybatis2sx.utils.Executor;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.Map;

/**
 * @author RaoShuang
 * @emil 991207823@qq.com
 * @date 2020/10/11 23:22
 * mapper代理类
 */
public class MapperProxy implements InvocationHandler {

    /**
     * 定义存储关系映射的容器
     * map的key是全限定类名+方法名
     */
    private Map<String, Mapper> mappers;
    /**
     * MySQL连接属性
     */
    private Connection conn;

    /**
     * 有参构造器
     * @param mappers mapper映射容器对象
     * @param conn 连接对象
     */
    public MapperProxy(Map<String,Mapper> mappers, Connection conn){
        this.mappers = mappers;
        this.conn = conn;
    }

    /**
     * 用于对方法进行增强的，我们的增强其实就是调用selectList方法
     * @param proxy 被代理对象
     * @param method 需增强方法
     * @param args 参数列表
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //1.获取方法名
        String methodName = method.getName();
        //2.获取方法所在类的名称
        String className = method.getDeclaringClass().getName();
        //3.组合key
        String key = className + "." + methodName;
        //4.获取mappers中的Mapper对象
        Mapper mapper = mappers.get(key);
        //5.判断是否有mapper
        if (mapper == null) {
            throw new IllegalArgumentException("传入的参数有误");
        }
        //6.调用工具类执行查询所有
        return new Executor().selectList(mapper, conn);
    }
}
